#ifndef ORDERLISTWIDGET_H
#define ORDERLISTWIDGET_H

#include <QWidget>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QHeaderView>
#include <QVBoxLayout>
#include <QList>
#include "models.h"
#include "datamanager.h"

// 使用命名空间
using namespace RestaurantSystem;

/**
 * @brief 订单列表组件
 * 
 * 提供订单列表的展示和管理功能：
 * - 表格形式展示订单基本信息
 * - 支持订单选择和双击
 * - 实时更新订单状态显示
 * - 优化显示性能
 */
class OrderListWidget : public QWidget
{
    Q_OBJECT

public:
    /**
     * @brief 表格列枚举
     */
    enum ColumnIndex {
        COL_ORDER_ID = 0,      // 订单号
        COL_CUSTOMER = 1,      // 顾客
        COL_STATUS = 2,        // 状态
        COL_AMOUNT = 3,        // 金额
        COL_CREATE_TIME = 4,   // 创建时间
        COL_COUNT = 5
    };

    explicit OrderListWidget(QWidget *parent = nullptr);
    ~OrderListWidget();

    /**
     * @brief 设置订单列表
     * @param orders 订单列表
     */
    void setOrders(const QList<Order>& orders);
    
    /**
     * @brief 添加新订单
     * @param order 新订单
     */
    void addOrder(const Order& order);
    
    /**
     * @brief 更新订单信息
     * @param order 更新的订单
     */
    void updateOrder(const Order& order);
    
    /**
     * @brief 移除订单
     * @param orderId 订单ID
     */
    void removeOrder(const QString& orderId);
    
    /**
     * @brief 清空选择
     */
    void clearSelection();
    
    /**
     * @brief 获取当前选中的订单ID
     * @return 订单ID，无选择则返回空字符串
     */
    QString getCurrentSelectedOrderId() const;

signals:
    /**
     * @brief 订单选择信号
     * @param orderId 选中的订单ID
     */
    void orderSelected(const QString& orderId);
    
    /**
     * @brief 订单双击信号
     * @param orderId 双击的订单ID
     */
    void orderDoubleClicked(const QString& orderId);

private slots:
    /**
     * @brief 处理选择变更
     */
    void onSelectionChanged();
    
    /**
     * @brief 处理双击事件
     * @param item 双击的项目
     */
    void onItemDoubleClicked(QTableWidgetItem* item);

private:
    /**
     * @brief 设置表格
     */
    void setupTable();
    
    /**
     * @brief 设置表格头部
     */
    void setupHeaders();
    
    /**
     * @brief 填充表格数据
     */
    void populateTable();
    
    /**
     * @brief 更新行数据
     * @param row 行索引
     * @param order 订单数据
     */
    void updateRowData(int row, const Order& order);
    
    /**
     * @brief 根据订单ID查找行索引
     * @param orderId 订单ID
     * @return 行索引，未找到返回-1
     */
    int findRowByOrderId(const QString& orderId);
    
    /**
     * @brief 获取状态显示文本和颜色
     * @param status 订单状态
     * @return 显示文本
     */
    QString getStatusDisplayText(OrderStatus status) const;
    
    /**
     * @brief 获取状态颜色
     * @param status 订单状态
     * @return 颜色字符串
     */
    QString getStatusColor(OrderStatus status) const;
    
    /**
     * @brief 根据顾客ID获取用户名
     * @param customerId 顾客ID
     * @return 用户名，未找到则返回顾客ID
     */
    QString getCustomerName(const QString& customerId) const;
    
    /**
     * @brief 格式化金额显示
     * @param amount 金额
     * @return 格式化后的字符串
     */
    QString formatAmount(double amount) const;
    
    /**
     * @brief 格式化时间显示
     * @param dateTime 时间
     * @return 格式化后的字符串
     */
    QString formatTime(const QDateTime& dateTime) const;

private:
    // UI组件
    QVBoxLayout* m_layout;
    QTableWidget* m_tableWidget;
    
    // 数据
    QList<Order> m_orders;
    
    // 当前选中项
    QString m_selectedOrderId;
    
    // 标志
    bool m_isUpdating;
};

#endif // ORDERLISTWIDGET_H
